// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Library General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  USA


#include "partida.h"



void Partida::EncolaEnRender()
{
	glPushMatrix();
	glRotatef(180, 0, 1, 0);	// Pruebas para rotar el pabellón
	int cancha;					// Se dibuajrá todo rotado menos la cancha
	for (int i = 0; i < num_estacionarios; i++) 
	{
		estacionario[i]->EnPuntoDeVista(render->X(), render->Y());
		if (estacionario[i]->GetID() != "pabellon_lineas_boccia.obj")
			estacionario[i]->Dibujate();
		else cancha = i;
	}
	glPopMatrix();

	estacionario[cancha]->Dibujate();	// Dibujamos finalmente la cancha
	
										// Si la cámara es táctica o 1ªpersona
										// dibujamos la dirección de la bola
	if (pila_estados.top().estado == EST_JUEGO ||
	    pila_estados.top().estado == EST_TACTICA)
		DibujarTrayectoria();
}





void Partida::DibujarEscena()
{

	// Para animar un poco el fondo en el menú principal
	if (pila_estados.top().estado == EST_MENU)
	{
		if (menu->GetID() == "principal")
			// Or todos los demás, ya miraré las ids
			// Aunque creo que queda mejor en este, si ocurre en los demás
			//  no ves una puta mierda, pero te da una sensación rara
			//  ver que algo al fondo se mueve
			render->camaras->GestionaEvento(O, 0.5, 0, delta);
	}
	
	render->Mirar();			//1.- Miramos 

	conjunto_bolas->Dibujar();	//2.- Dibujamos los objetos
	EncolaEnRender();

	
	if (hud != NULL)
		hud->Dibujar();
	if (menu != NULL)
		menu->Dibujar();
	if (cursor_mirada.visible)
		DibujarCursor();

	
	render->Mostrar();			//3.- Hacemos el Swap
}







void Partida::DibujarTrayectoria()
{
	double fromx, fromz;
	double tox, toz;

	float* box = render->camaras->GetPosicionBox();
	float* mirada = render->camaras->GetDireccion();

	fromx = box[0];
	fromz = box[2];

	tox = mirada[0] * 9 + fromx; // 10 metros, pojemplo
	toz = mirada[2] * 9 + fromz;
	
	glDisable(GL_LIGHTING);
	glDisable(GL_TEXTURE_2D);
	glDisable(GL_BLEND);
	
	glColor3f(1.0, 1.0, 1.0);
	glBegin(GL_LINE_STRIP);
		glVertex3f(fromx, 0.047, fromz);
		glVertex3f(tox, 0.047, toz);
	glEnd();
}




void Partida::SetIndexCursor(desplazamiento des)
{
	switch (des.evento)
	{
		case N:
			cursor_mirada.index = 1;
			break;
		case NE:
			cursor_mirada.index = 3;
			break;
		case E:
			cursor_mirada.index = 5;
			break;
		case SE:
			cursor_mirada.index = 7;
			break;
		case S:
			cursor_mirada.index = 9;
			break;
		case SO:
			cursor_mirada.index = 11;
			break;
		case O:
			cursor_mirada.index = 13;
			break;
		case NO:
			cursor_mirada.index = 15;
			break;
		default:
			cursor_mirada.index = 0;
			break;
	}
	if (des.factor_x > 1 || des.factor_y > 1)
		cursor_mirada.index++;
	
	
}


void Partida::DibujarCursor()
{
	hud->SetOrtho();

	glEnable(GL_BLEND);
	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, cursor_mirada.images[cursor_mirada.index]);
	int x_inicio = cursor_mirada.x - 110 / 2;
	int x_final = cursor_mirada.x + 110 / 2;
	int y_inicio = cursor_mirada.y - 88 / 2;
	int y_final = cursor_mirada.y + 88 / 2;
	
	glBegin(GL_QUADS);

		glTexCoord2f(0,0);	glVertex2i(x_inicio, y_inicio);
		glTexCoord2f(1,0);	glVertex2i(x_final, y_inicio);
		glTexCoord2f(1, 1);	glVertex2i(x_final, y_final);
		glTexCoord2f(0, 1);	glVertex2i(x_inicio, y_final);

	glEnd();
	glDisable(GL_TEXTURE_2D);
	glDisable(GL_BLEND);
	
	hud->UnsetOrtho();
}